home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / roman / roman3.bas < prev    next >
BASIC Source File  |  1994-06-01  |  11KB  |  339 lines

  1. 10 '
  2. 20 '====ローマ字仮名変換プログラム by 金子卓哉=====
  3. 30 '    (FOR FUJITSU FM TOWNS F-BASIC386 V2.1)
  4. 40 '
  5. 50 '内容
  6. 60 '   指定されたファイルを読み込み、
  7. 70 '  半角アルファベット部を仮名変換して、画面に表示する。
  8. 80 '   半角アルファベットでない部分はそのまま表示する。
  9. 90 '   アルファベットの大文字小文字の区別はしない。
  10. 100 '   入力ファイル名は、プログラム内で文字列 INPDEVICE$ に設定する。
  11. 110 '
  12. 120 '
  13. 130 '変数一覧
  14. 140 '
  15. 150 '  I, J        汎用変数
  16. 160 '  TRUE  = -1
  17. 170 '  FALSE =  0  真偽判定用 定数
  18. 180 '
  19. 190 '  INPDEVICE$  入力ファイル指定用 文字列変数
  20. 200 '
  21. 210 '  S$  一行読み込み用 文字列変数
  22. 220 '  C$  一文字読み込み用 文字列変数
  23. 230 '
  24. 240 '  CH  キャラクタコード
  25. 250 '
  26. 260 '  N1  現在処理中の文字番号
  27. 270 '  N2  一つ前の文字番号
  28. 280 '  N3  二つ前の文字番号
  29. 290 '
  30. 300 '      N1 : A=0 から 「文字コードデータ」部の順に割り当てる
  31. 310 '      N2, N3 には、 N1 が順送りされていく。
  32. 320 '
  33. 330 '  ST  現在の状態を表す変数
  34. 340 '
  35. 350 '      ST = 0  変換直後。 N1 のみ考慮すればよい。
  36. 360 '      ST = 1  一文字保留中。 N2 と N1 を考慮する。
  37. 370 '      ST = 2  二文字保留中。 N3 と N2 と N1 を考慮する。
  38. 380 '
  39. 390 '  ATTR(Nn)    文字属性用 配列       Nn:文字番号
  40. 400 '
  41. 410 '      ATTR(Nn) = 0  母音
  42. 420 '                 1  子音
  43. 430 '                 2  その他
  44. 440 '
  45. 450 '  CODE(Nn)    文字コード用 配列     Nn:文字番号
  46. 460 '
  47. 470 '      規定の文字コードを表す。
  48. 480 '
  49. 490 '  KANA$(Cs,Cb)   変換表用 文字列配列
  50. 500 '      Cs:子音の文字コード, Cb:母音の文字コード
  51. 510 '      子音と母音の文字コードに対応する、 仮名文字列
  52. 520 '
  53. 530 '
  54. 540 '----データ部----
  55. 550 '
  56. 560 *ZOKUSEI'    文字属性データ(0:母音 1:子音 2:特例 3:その他)
  57. 570 '     A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P ' 文字番号 0~15
  58. 580 DATA  0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 ' 文字属性
  59. 590 '     Q  R  S  T  U  V  W  X  Y  Z  ' CH SH TS LY 他 ' 文字番号16~31
  60. 600 DATA  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3 ' 文字属性
  61. 610 '
  62. 620 *MOJICODE'   文字コードデータ
  63. 630 '     A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P ' 文字番号 0~15
  64. 640 DATA  0,12,23,11, 3,16, 9, 5, 1,14, 1,21, 6, 4, 4,13 ' 文字コード
  65. 650 '     Q  R  S  T  U  V  W  X  Y  Z  ' CH SH TS LY 他 ' 文字番号16~31
  66. 660 DATA 24, 8, 2, 3, 2,17,15,25, 7,10,26,18,19,20,22,27 ' 文字コード
  67. 670 '
  68. 680 *HENKANHYOU' 変換表データ(数字は文字コード)
  69. 690 '     A    I    U    E    O  単独
  70. 700 '     0    1    2    3    4    5
  71. 710 DATA ア    ,イ   ,ウ   ,エ   ,オ   ,    ' 0 A
  72. 720 DATA カ    ,キ   ,ク   ,ケ   ,コ   ,ク   ' 1 K  ここから
  73. 730 DATA サ    ,シ   ,ス   ,セ   ,ソ   ,ス   ' 2 S
  74. 740 DATA タ    ,チ   ,ツ   ,テ   ,ト   ,ト   ' 3 T
  75. 750 DATA ナ    ,ニ   ,ヌ   ,ネ   ,ノ   ,ン   ' 4 N
  76. 760 DATA ハ    ,ヒ   ,フ   ,ヘ   ,ホ   ,フ   ' 5 H
  77. 770 DATA マ    ,ミ   ,ム   ,メ   ,モ   ,ム   ' 6 M
  78. 780 DATA ヤ    ,イ   ,ユ   ,イェ  ,ヨ   ,イ   ' 7 Y
  79. 790 DATA ラ    ,リ   ,ル   ,レ   ,ロ   ,ル   ' 8 R
  80. 800 DATA ガ   ,ギ  ,グ  ,ゲ  ,ゴ  ,グ  ' 9 G
  81. 810 DATA ザ   ,ジ  ,ズ  ,ゼ  ,ゾ  ,ズ  '10 Z
  82. 820 DATA ダ   ,ヂ  ,ヅ  ,デ  ,ド  ,ド  '11 D
  83. 830 DATA バ   ,ビ  ,ブ  ,ブ  ,ボ  ,ブ  '12 B
  84. 840 DATA パ   ,ピ  ,プ  ,ペ  ,ポ  ,プ  '13 P
  85. 850 DATA ジャ  ,ジ  ,ジュ ,ジェ ,ジョ ,ジ  '14 J  ここまでが子音1
  86. 860 DATA ワ    ,ウィ  ,ウ   ,ウェ  ,ヲ   ,ウ   '15 W
  87. 870 DATA ファ   ,フィ  ,フ   ,フェ  ,フォ  ,フ   '16 F
  88. 880 DATA ヴァ  ,ヴィ ,ヴ  ,ヴェ ,ヴォ ,ヴ  '17 V
  89. 890 DATA チャ   ,チ   ,チュ  ,チェ  ,チョ  ,チ   '18 CH
  90. 900 DATA シャ   ,シ   ,シュ  ,シェ  ,ショ  ,シュ  '19 SH
  91. 910 DATA トサ   ,トシ  ,ツ   ,トセ  ,トソ  ,ツ   '20 TS
  92. 920 DATA ラ    ,リ   ,ル   ,レ   ,ロ   ,ル   '21 L
  93. 930 DATA リャ   ,リィ  ,リュ  ,リェ  ,リョ  ,リィ  '22 LY  
  94. 940 DATA キャ   ,シ   ,ク   ,セ   ,コ   ,ク   '23 C
  95. 950 DATA クァ   ,クィ  ,ク   ,クェ  ,クォ  ,ク   '24 Q
  96. 960 DATA グザ ,グジ,クス  ,グゼ,クソ  ,クス  '25 X
  97. 970 DATA ャ    ,ィ   ,ュ   ,ェ   ,ョ   ,    '26 子音 + Y
  98. 980 '                                   27 その他
  99. 990 '
  100. 1000 '----初期設定----
  101. 1010 '
  102. 1020 SCREEN@ 0 : CLS ' 画面設定
  103. 1030 DEFINT A-Z
  104. 1040 ON KEY(1) GOSUB *END : ON ERROR GOTO *ERR ' 割り込み処理設定
  105. 1050 '
  106. 1060 TRUE = -1 : FALSE = 0 ' 真偽判定用定数
  107. 1070 '
  108. 1080 '配列宣言
  109. 1090 ATTRMAX = 31 : CODEMAX = 31 : BOINMAX = 5 : SIINMAX = 26
  110. 1100 DIM ATTR(ATTRMAX), CODE(CODEMAX), KANA$(SIINMAX, BOINMAX)
  111. 1110 '
  112. 1120 '各配列にデータを読み込む
  113. 1130 RESTORE *ZOKUSEI
  114. 1140 FOR I=0 TO ATTRMAX
  115. 1150   READ ATTR(I)       '文字属性
  116. 1160 NEXT
  117. 1170 RESTORE *MOJICODE
  118. 1180 FOR I=0 TO CODEMAX
  119. 1190   READ CODE(I)       '文字コード
  120. 1200 NEXT
  121. 1210 RESTORE *HENKANHYOU
  122. 1220 FOR J=0 TO SIINMAX
  123. 1230   FOR I=0 TO BOINMAX
  124. 1240     READ KANA$(J, I)  '変換表
  125. 1250   NEXT
  126. 1260 NEXT
  127. 1270 '
  128. 1280 '----メインプログラム----
  129. 1290 '
  130. 1300 *START
  131. 1310 '
  132. 1320 MOUSE 0 ' マウス機能初期化
  133. 1330 KEY(1) ON ' 割り込み開始
  134. 1340 '
  135. 1350 GOSUB *INPUTFILE ' ファイル名入力ルーチンへ
  136. 1360 '
  137. 1370 OPEN "I", #1, INPDEVICE$ ' ファイルオープン(既存, 入力モード )
  138. 1380 '
  139. 1390 GOSUB *CAUTION ' 注意表示
  140. 1400 '
  141. 1410 '以下, ファイルの終わりまで繰り返す
  142. 1420 WHILE (EOF(1) = FALSE) AND (INKEY$ = "")
  143. 1430   '
  144. 1440   LINE INPUT #1, S$ ' 一行読み込み
  145. 1450   ST=0
  146. 1460   '
  147. 1470   '空行でなければ以下実行
  148. 1480   IF (KLEN(S$,0) > 0) THEN
  149. 1490     '
  150. 1500     '以下, 一文字目から一行の終わりまで繰り返す
  151. 1510     FOR I=1 TO KLEN(S$,0)
  152. 1520       '
  153. 1530       C$ = KMID$(S$,I,1) ' I文字目読み込み
  154. 1540       CH = ASC(C$) ' キャラクタコードを求める
  155. 1550       '
  156. 1560       GOSUB *CH_TO_N1 ' 規定の文字番号を求める
  157. 1570       '
  158. 1580       '状態によって分岐
  159. 1590       ON ST+1 GOSUB *HENKAN1, *HENKAN2, *HENKAN3
  160. 1600       '
  161. 1610       N3 = N2 : N2 = N1 ' 次の文字へ
  162. 1620       '
  163. 1630       'マウスが押されていたらリリース待ち
  164. 1640       WHILE (MOUSE(2,0) = TRUE) : WEND
  165. 1650       '
  166. 1660     NEXT
  167. 1670     '
  168. 1680   ENDIF
  169. 1690   '
  170. 1700   PRINT ' 一行終わったので改行
  171. 1710 WEND
  172. 1720 '
  173. 1730 CLOSE ' ファイルクローズして初めに戻る
  174. 1740 COLOR 5 : PRINT : PRINT "変換終了です。"
  175. 1750 GOTO *START
  176. 1760 '
  177. 1770 '
  178. 1780 '---以下、 サブルーチン---
  179. 1790 '
  180. 1800 '一文字目
  181. 1810 *HENKAN1
  182. 1820   IF (ATTR(N1) = 0) THEN ' 母音の場合
  183. 1830     PRINT KANA$(0, CODE(N1)); ' そのまま変換して変換終了
  184. 1840     ST = 0
  185. 1850   ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
  186. 1860     ST = 1 ' 通常は一文字保留だが
  187. 1870     IF (I = KLEN(S$,0)) THEN
  188. 1880       PRINT KANA$(CODE(N1), 5); ' 文末の場合のみ出力して変換終了
  189. 1890       ST = 0
  190. 1900     ENDIF
  191. 1910   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  192. 1920     IF (N1 = 23) THEN ' 「X」の場合は「ー」を出力し
  193. 1930       PRINT "ー"; 
  194. 1940     ELSE IF (N1 = 26) THEN ' 「'」の場合はそのまま出力し
  195. 1950       PRINT C$;
  196. 1960     ENDIF ' 「Q」の場合は何もしないで
  197. 1970     ST = 0 ' 変換終了
  198. 1980   ELSE ' アルファベットでない文字の場合
  199. 1990     PRINT C$; ' そのまま出力して変換終了
  200. 2000     ST = 0
  201. 2010   ENDIF
  202. 2020 RETURN
  203. 2030 '
  204. 2040 '二文字目(子音 + 二文字目)
  205. 2050 *HENKAN2
  206. 2060   IF (ATTR(N1) = 0) THEN ' 母音の場合
  207. 2070     PRINT KANA$(CODE(N2), CODE(N1)); ' 子音と併せて変換して変換終了
  208. 2080     ST = 0
  209. 2090   ELSE IF (ATTR(N1) = 1) THEN ' 二文字目も子音の場合
  210. 2100     IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
  211. 2110       PRINT "ッ"; ' 「ッ」を出力して一文字保留
  212. 2120       ST = 1
  213. 2130     ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
  214. 2140       N1 = 27 ' 子音を「CH」にして一文字保留
  215. 2150       ST = 1
  216. 2160     ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
  217. 2170       N1 = 28 ' 子音を「SH」にして一文字保留
  218. 2180       ST = 1
  219. 2190     ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
  220. 2200       N1 = 29 ' 子音を「TS」にして一文字保留
  221. 2210       ST = 1
  222. 2220     ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
  223. 2230       N1 = 30 ' 子音を「LY」にして一文字保留
  224. 2240       ST = 1
  225. 2250     ELSE ' それ以外の「子音 + 子音」の場合は
  226. 2260       ST = 2 ' 通常は二文字保留だが
  227. 2270       IF (I = KLEN(S$,0)) THEN ' 文末の場合
  228. 2280         PRINT KANA$(CODE(N2), 5);
  229. 2290         ST = 0
  230. 2300       ENDIF
  231. 2310     ENDIF
  232. 2320     IF (I = KLEN(S$,0)) THEN
  233. 2330       PRINT KANA$(CODE(N1), 5); ' 文末の場合
  234. 2340       ST = 0
  235. 2350     ENDIF
  236. 2360   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  237. 2370     PRINT KANA$(CODE(N2), 5);
  238. 2380     ST = 0 ' 変換終了
  239. 2390   ELSE ' アルファベットでない場合
  240. 2400     PRINT KANA$(CODE(N2), 5);
  241. 2410     PRINT C$; ' そのまま出力して変換終了
  242. 2420     ST = 0
  243. 2430   ENDIF
  244. 2440 RETURN
  245. 2450 '
  246. 2460 '三文字目(子音 + 子音 + 三文字目)
  247. 2470 *HENKAN3
  248. 2480   IF (ATTR(N1) = 0) THEN ' 母音の場合
  249. 2490     IF ((1 <= CODE(N3)) AND (CODE(N3) <= 14)) AND (N2 = 24) THEN
  250. 2500       ' 「子音1 + Y + 母音」の場合  例  KYA -> KI + LYA -> きゃ
  251. 2510       PRINT KANA$(CODE(N3), 1) + KANA$(26, CODE(N1));
  252. 2520     ELSE ' それ以外の場合
  253. 2530       PRINT KANA$(CODE(N3), 5);
  254. 2540       PRINT KANA$(CODE(N2), CODE(N1)); ' 「子音 + 母音」を出力して
  255. 2550     ENDIF
  256. 2560     '変換終了
  257. 2570     ST = 0
  258. 2580   ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
  259. 2590     PRINT KANA$(CODE(N3), 5); ' 通常は最初の子音は切り捨てて
  260. 2600     ST = 2 ' 二文字保留
  261. 2610     IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
  262. 2620       PRINT "ッ"; ' 「ッ」を出力して一文字保留
  263. 2630       ST = 1
  264. 2640     ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
  265. 2650       N1 = 27 ' 子音「CH」一文字のみ保留
  266. 2660       ST = 1
  267. 2670     ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
  268. 2680       N1 = 28 ' 子音「SH」一文字のみ保留
  269. 2690       ST = 1
  270. 2700     ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
  271. 2710       N1 = 29 ' 子音「TS」一文字のみ保留
  272. 2720       ST = 1
  273. 2730     ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
  274. 2740       N1 = 30 ' 子音「LY」一文字のみ保留
  275. 2750       ST = 1
  276. 2760     ENDIF
  277. 2770     IF (I = KLEN(S$,0)) AND (ST = 2) THEN ' 文末の場合は
  278. 2780       PRINT KANA$(CODE(N2), 5) + KANA$(CODE(N1), 5);
  279. 2790       ST = 0
  280. 2800     ELSE IF (I = KLEN(S$,0)) AND (ST = 1) THEN
  281. 2810       PRINT KANA$(CODE(N1), 5);
  282. 2820       ST = 0
  283. 2830     ENDIF
  284. 2840   ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
  285. 2850     PRINT KANA$(CODE(N3), 5) + KANA$(CODE(N2), 5);
  286. 2860     ST = 0 ' 変換終了
  287. 2870   ELSE ' アルファベットでない場合
  288. 2880     PRINT KANA$(CODE(N3), 5) + KANA$(CODE(N2), 5);
  289. 2890     PRINT C$; ' そのまま出力して変換終了
  290. 2900     ST = 0 
  291. 2910   ENDIF
  292. 2920 RETURN
  293. 2930 '
  294. 2940 'キャラクタコードから、 規定の文字番号を求める
  295. 2950 *CH_TO_N1
  296. 2960   IF (ASC("A") <= CH) AND (CH <= ASC("Z")) THEN ' 大文字
  297. 2970     N1 = CH - ASC("A")
  298. 2980   ELSE IF (ASC("a") <= CH) AND (CH <= ASC("z")) THEN ' 小文字
  299. 2990     N1 = CH - ASC("a")
  300. 3000   ELSE IF (CH = ASC("'")) THEN ' 「'」
  301. 3010     N1 = 26
  302. 3020   ELSE ' アルファベットでない文字
  303. 3030     N1 = 31
  304. 3040   ENDIF
  305. 3050 RETURN
  306. 3060 '
  307. 3070 '入力ファイル名指定
  308. 3080 *INPUTFILE
  309. 3090   PRINT : COLOR 4
  310. 3100   PRINT "ローマ字仮名変換プログラム(冗談版) by たくりん"
  311. 3110   COLOR 7 : PRINT "マウス左クリック待ちです";
  312. 3120   PRINT "([CTRL]+[ESC]→サイドワーク,[PF 1]→終了)。"
  313. 3130   PRINT "準備が出来たら左クリックして下さい(カーソルが現れます)。"
  314. 3140   PRINT "INPUT FILE ? >";
  315. 3150   WHILE (MOUSE(2,0) = FALSE) : WEND
  316. 3160   LINE INPUT INPDEVICE$
  317. 3170 RETURN
  318. 3180 '
  319. 3190 '注意表示
  320. 3200 *CAUTION
  321. 3210   COLOR 5 : PRINT
  322. 3220   PRINT "マウスの左ボタンを押している間表示が止まります。";
  323. 3230   PRINT "また、何かキーを押すと中断し、最初に戻ります。"
  324. 3240   PRINT : COLOR 7
  325. 3250 RETURN
  326. 3260 '
  327. 3270 'エラー時
  328. 3280 *ERR
  329. 3290   CLOSE : COLOR 2 : PRINT
  330. 3300   PRINT "何かエラーが起きました。 エラー番号";ERR;"エラー行";ERL
  331. 3310 RESUME *START
  332. 3320 '
  333. 3330 '終了
  334. 3340 *END
  335. 3350   CLOSE : MOUSE 5
  336. 3360   COLOR 5 : PRINT : PRINT : PRINT "終了します。" : COLOR 7
  337. 3370 END
  338. 3380 '
  339.